package d2p

import (
	"encoding/binary"
	"hy_808/protocol/hygprs"
	"hy_808/protocol/jtt808"
)

type Register struct {
	jtt808.Jtt808
	ProvinceId  uint16 //省域 ID 标示终端安装车辆所在的省域，0 保留，由平 台取默认值。省域 ID 采用 GB/T 2260 中规定 的行政区划代码六位中前两位。
	CityId      uint16 //市县域 ID 标示终端安装车辆所在的市域和县域，0 保留， 由平台取默认值。市县域 ID 采用 GB/T 2260 中规定的行政区划代码六位后四位。
	ProducerId  []byte //制造商 ID 五个字节，终端制造商编码。
	DeviceModel []byte //终端型号 八个字节，此终端型号由制造商自行定义，位数不是八位的，补空格。
	DeviceId    []byte //终端 ID 七个字节，由大写字母和数字组成，此终端 ID 由制造商自行定义。
	Color       byte   // 车牌颜色，按照 JT/T 415-2006 的 5.4.12 0.未上车牌 1.蓝色 2.黄色 3.黑色 4.白色 9.其他
	Card        string //车牌号
	data        []byte //完整消息体 字节切片
	dataLen     int    // 消息体长度
}

func (this *Register) SetProvinceId(provinceId uint16) {
	this.ProvinceId = provinceId
	this.dataLen += 2
}

func (this *Register) GetProvinceId() []byte {
	b := make([]byte, 2)
	binary.BigEndian.PutUint16(b, this.ProvinceId)
	return b
}

func (this *Register) SetCityId(cityId uint16) {
	this.CityId = cityId
	this.dataLen += 2
}

func (this *Register) GetCityId() []byte {
	b := make([]byte, 2)
	binary.BigEndian.PutUint16(b, this.CityId)
	return b
}

// 制造商编号  5字节
func (this *Register) SetProducerId(producerId string) *Register {
	producerId = jtt808.ToGBK(producerId)
	producerIdBytes := []byte(producerId)
	producerIdBytesLen := len(producerIdBytes)
	bf := make([]byte, 5)
	//制造商编号 字节数组后拷贝到bf 5个字节长度
	if producerIdBytesLen > 5 {
		copy(bf, producerIdBytes[producerIdBytesLen-5:producerIdBytesLen])
	} else {
		copy(bf[5-producerIdBytesLen:], producerIdBytes)
	}
	this.ProducerId = bf
	this.dataLen += 5
	return this
}

func (this *Register) GetProducerId() []byte {
	return this.ProducerId
}

// 设备终端型号 8字节
func (this *Register) SetDeviceModel(model string) *Register {
	model = jtt808.ToGBK(model)
	//jtt808.StrToBytes(model, 20)
	this.DeviceModel = jtt808.StrToBytes(model, 20)
	this.dataLen += 8
	return this
}

func (this *Register) GetDeviceModel() []byte {
	return this.DeviceModel
}

// 终端编号 7字节
func (this *Register) SetDeviceId(deviceId string) *Register {
	//deviceId = strings.Repeat(" ", 8-len(deviceId)) + deviceId
	//deviceId = jtt808.ToGBK("HYADS01")
	this.DeviceId = jtt808.StrToBytes(deviceId, 7)
	this.dataLen += 7
	return this
}

func (this *Register) GetDeviceId() []byte {
	return this.DeviceId
}

func (this *Register) SetColor(color byte) *Register {
	this.Color = color
	this.dataLen += 1
	return this
}

func (this *Register) GetColor() []byte {
	return []byte{this.Color}
}

// 车牌号 string 不定长
func (this *Register) SetCard(card string) *Register {
	card = jtt808.ToGBK(card)
	//b := append([]byte(card), '0')
	b := []byte(card)
	this.Card = string(b)
	carLen := len(b)
	this.dataLen += carLen
	return this
}

func (this *Register) GetCard() []byte {
	b := []byte(this.Card)
	return b
}

func (this *Register) SetBodyData() {
	this.data = hygprs.SlicesAppend(
		this.GetProvinceId(),
		this.GetCityId(),
		this.GetProducerId(),
		this.GetDeviceModel(),
		this.GetDeviceId(),
		this.GetColor(),
		this.GetCard(),
	)
	//检验实际长度
	//if len(this.data) != this.dataLen {
	//	log.Println("实际长度异常")
	//}
}

func (this *Register) GetBodyData() []byte {
	return this.data
}

func (this *Register) GetDataLen() int {
	return this.dataLen
}

func GenDeviceRegister(provinceId, cityId int, producerId, deviceModel, phone, deviceId string, color byte, card string) Register {
	login := Register{}
	login.SetProvinceId(uint16(provinceId))
	login.SetCityId(uint16(cityId))
	login.SetProducerId(producerId)
	login.SetDeviceModel(deviceModel)
	login.SetDeviceId(deviceId)
	login.SetColor(color)
	login.SetCard(card)
	login.SetBodyData()
	login.SetBody(login.GetBodyData())

	login.Head = jtt808.Head{}
	login.Head.SetId(jtt808.DeviceReg) //注册消息头标识
	bodyLen := len(login.Body)
	login.Head.SetAttribute(int16(bodyLen), 0, 0)
	//busId, _ := strconv.Atoi(deviceId)
	//phone := base.MakePhoneByBusId(busId)
	//phoneBytes := base.Number2bcd(phone)
	login.Head.SetPhone(phone) //6字节
	login.Head.SetSeriaNo(0)
	login.SetCheckCode()
	login.ToBytes()
	return login
}
